/**
 * 常用的数组工具类
 */
const ArrayUtils = {
    /**
     * 不替换地址的情况下，清空数组元素
     * @param arr
     */
    clean(arr){
        if(ArrayUtils.isArray(arr)){
            arr.splice(0);
        }
    },
    /**
     * 不替换地址的情况下复制数组
     * @param source 源数组
     * @param target 目标数组
     */
    copy(source, target){
        ArrayUtils._requireArray(source, "source");
        ArrayUtils._requireArray(target, "target");
        ArrayUtils.clean(target);
        source.forEach( arr => target.push(arr));
    },
    /**
     * 判断是否为数组对象
     * @param arr 数组
     * @returns {*|boolean} true - 为数组
     */
    isArray( arr ){
        return Array.isArray(arr);
    },
    /**
     * 判断是否为数组对象
     * @param arr 数组
     * @returns {boolean} true - 不为数组
     */
    notArray( arr ){
        return !ArrayUtils.isArray(arr);
    },

    /**
     * 必要数组检查
     * @param arr 数组
     * @param argName 自定义参数名
     * @private 内部使用
     */
    _requireArray( arr, argName){
        argName = argName || "arr";
        if( ArrayUtils.notArray( arr )){
            throw new Error("The "+argName+" doesn't a array obj");
        }
    },
    /**
     * 创建二维数组
     * @param rows 行数
     * @param cols 列数
     * @returns {any[]} 数组对象
     */
    dyadicArray: function(rows,cols){
        let arr = new Array(rows);
        for(let i= 0; i < rows; i++){
            arr[i] = new Array(cols);
            for(let j = 0; j< cols; j++){
                arr[i][j] = undefined;
            }
        }
        return arr;
    },
    /**
     * 深度多维forEach，针对多维数组
     * @param arr 数组对象
     * @param process 遍历方法
     * @param level 遍历层级
     */
    deepForEach: function(arr, process, level){
        level = level || 0;
        arr.forEach( (item,index) => {
            if( item instanceof Array){
                ArrayUtils.deepForEach(item, process, index);
            }else{
                process(item,level,index);
            }
        });
    }
};
export default ArrayUtils;